package com.kll.carolinehmibiz.net

import com.kll.carolinehmibiz.base.net.UrlConfig
import com.kll.carolinehmibiz.base.net.bean.BaseHttpResult
import com.kll.carolinehmibiz.net.bean.*
import io.reactivex.Observable
import okhttp3.RequestBody
import retrofit2.http.*

/**
 * ====================================================
 * Created by Ziliang Cai  on 2021/12/06 21:16
 * <a href="mailto:752577456@qq.com">Contact me</a>
 * ====================================================
 */
open interface CarolineNetApi {

    /**
     * 获取激活状态
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_GET_ACTIVE_STATUS)
    fun getDeviceActiveStatus(@Field("device_type") deviceType: Int): Observable<BaseHttpResult<GetActiveStatusResponse>>

    /**
     * 激活设备
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_ACTIVE_DEVICE)
    fun activeDevice(@Field("mobile") mobile: String, @Field("code") code:String, @Field("device_type") deviceType: Int): Observable<BaseHttpResult<LoginResponse>>

    /**
     * 获取系统菜单
     *
     * @param module 模块，app传：home
     * @param menuId 菜单id，0的时候返回全部
     * @param isLayer 0，1 是否返回本级菜单
     * @param level 显示多少级深度 null:全部
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_GET_MENU)
    fun getSystemMenu(@Field("module") module: String, @Field("menu_id") menuId: Int,
                      @Field("is_layer") isLayer: Int, @Field("level") level: Int?): Observable<BaseHttpResult<ArrayList<GetSystemMenuResponse>>>

    /**
     * 获取系统菜单详情
     * @param menuId 菜单ID
     */
    @GET(UrlConfig.PATH_GET_MENU_DETAIL + "/{menu_id}")
    fun getSystemMenuDetail(@Path("menu_id") menuId: Int): Observable<BaseHttpResult<ArrayList<GetSystemMenuDetailResponse>>>

    @FormUrlEncoded
    @POST(UrlConfig.PATH_GET_VERIFI_CODE)
    fun getVerifiCode(@Field("appkey") appkey: String,
                      @Field("mobile") mobile: String): Observable<BaseHttpResult<ArrayList<EmptyResponse>>>

    @FormUrlEncoded
    @POST(UrlConfig.PATH_USER_LOGIN)
    fun login( @Field("code") code: String,
                      @Field("mobile") mobile: String): Observable<BaseHttpResult<LoginResponse>>

    /**
     * 重置密码
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_RESET_PWD)
    fun resetPwd( @Field("code") code: String, @Field("mobile") mobile: String,
                @Field("pwd") pwd: String, @Field("confirm_pwd") confirmPwd: String): Observable<BaseHttpResult<EmptyResponse>>
    /**
     * 用户注册
     * @param groupId 1：超级管理员；2：普通管理员 3:APP会员
     * @param mobile 手机号
     * @param sn 电视sn码
     * @param code 验证码
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_USER_REGISTER)
    fun register( @Field("group_id") groupId: Int, @Field("sn") sn: String,
               @Field("mobile") mobile: String, @Field("code") code: String): Observable<BaseHttpResult<Boolean>>

    /**
     * 获取上文件token信息
     */
    @POST(UrlConfig.PATH_GET_UPLOAD_INFO)
    fun getUploadInfo(): Observable<BaseHttpResult<GetUploadInfoReponse?>>

    /**
     * 上传文件
     *
     * @param key
     * @param token
     * @param file
     */
//    @FormUrlEncoded
//    @Multipart
    @POST
    fun uploadFile(@Url url: String, @Body body: RequestBody): Observable<BaseHttpResult<ArrayList<UploadFileResponse>?>>

//    /**
//     * 下载文件
//     */
//    @Streaming
//    @GET
//    fun downloadFile(@Url url: String): Observable<ResponseBody>

    /**
     * 获取用户信息
     */
    @GET(UrlConfig.PATH_GET_USERINFO)
    fun getUserInfo(): Observable<BaseHttpResult<GetUserInfoResponse?>>

    /**
     * 修改用户信息
     *
     * @param userName 用户名
     * @param headPic 头像
     * @param sex 性别
     * @param birthday 生日
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_EDIT_USERINFO)
    fun editUserInfo(@Field("username") userName: String, @Field("head_pic") headPic: String,   @Field("sex") sex: Int,  @Field("birthday") birthday: String) : Observable<BaseHttpResult<EmptyResponse?>>

    /**
     * 获取设置信息
     * @param module
     * @param code
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_GET_SETTING)
    fun getSetting(@Field("module") module: String, @Field("code") code: String) : Observable<BaseHttpResult<GetSettingResponse>>

    /**
     * 获取分配客服
     *
     * @param type 客服类型 1：默认客服，2：基因检测，3：全息影像筛查，4：饮食检测，5：失忆预防检测，6：中医检测，7；睡眠呼吸检测，8；中医康复，9；饮食康复，10；运动健康，11；再生医学康复，12；睡眠障碍康复，13；自助问诊
     */
    @GET(UrlConfig.PATH_GET_ASSIGN_CUSTOMER_SERVICE)
    fun getAssignCustomerService(@Query("type") type: Int) : Observable<BaseHttpResult<GetAssignCustomerServiceResponse?>>

    /**
     * 生成userSig(腾讯IM)
     *
     * @param identifier 用户ID
     * @param expire 过期时间
     */
    @GET(UrlConfig.PATH_CREATE_USERSIG)
    fun createUserSig(@Query("identifier") identifier: String, @Query("expire") expire: Long) : Observable<BaseHttpResult<GetCreateUserSig>>

    /**
     * 获取IM房间号
     *
     */
    @GET(UrlConfig.PATH_GET_ROOMID)
    fun getRoomId(@Query("tencent_user_id") tencentUserId: String): Observable<BaseHttpResult<GetRoomIdResponse>>

    /**
     * 添加家人
     *
     * @param mobile 手机号
     * @param avatar 头像url
     * @param firstName 姓氏
     * @param lastName 名
     * @param remark 备注
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_ADD_FAMILY)
    fun addFamily(@Field("mobile") mobile: String, @Field("avatar") avatar: String, @Field("first_name") firstName: String,
                  @Field("last_name") lastName: String, @Field("remark") remark: String) : Observable<BaseHttpResult<EmptyResponse?>>


    /**
     * 编辑家人
     *
     * @param familyId 家人ID
     * @param mobile 手机号
     * @param avatar 头像url
     * @param firstName 姓氏
     * @param lastName 名
     * @param remark 备注
     *
     *
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_EDIT_FAMILY)
    fun editFamily(@Field("family_id") familyId: Int, @Field("mobile") mobile: String, @Field("avatar") avatar: String,
                   @Field("first_name") firstName: String, @Field("last_name") lastName: String, @Field("remark") remark: String) : Observable<BaseHttpResult<EmptyResponse?>>


    /**
     * 获取家人列表
     */
    @GET(UrlConfig.PATH_GET_FAMILY)
    fun getFamily() : Observable<BaseHttpResult<ArrayList<GetFamilyResponse>?>>

    /**
     * 获取用户活跃的腾讯云IM用户id
     */
    @GET(UrlConfig.GET_TENCENT_ID)
    fun getTencentId(@Query("tencent_user_id") tencentUserId: String): Observable<BaseHttpResult<GetTencentUserIdResponse>>

    /**
     * 删除家人
     *
     * @param familyId 家人ID
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_DEL_FAMILY)
    fun delFamily(@Field("family_id") familyId: Int) : Observable<BaseHttpResult<String?>>

    /**
     * 获取广告
     *
     * @param code app-index 首页轮播图
     */
    @FormUrlEncoded
    @POST(UrlConfig.PATH_GET_ADS)
    fun getAds(@Field("code") code: String): Observable<BaseHttpResult<GetAdsResponse?>>

    /**
     * 获取疾病列表
     */
    @GET(UrlConfig.PATH_GET_DISEASE)
    fun getDiseases(@Query("max_id") maxId: Int?): Observable<BaseHttpResult<GetDiseaseResponse?>>

    /**
     * 我的预约
     */
    @GET(UrlConfig.PATH_GET_CALLLOG)
    fun getCallLog(@Query("max_id") maxId: Int?): Observable<BaseHttpResult<GetCalllogResponse>>

    /**
     *
     * 获取省市区
     * @param regionId 地区码code，1为查询中国所有地区
     */
    @POST(UrlConfig.PATH_GET_REGION)
    fun getRegion(@Query("region_id") regionId: Int): Observable<BaseHttpResult<ArrayList<GetRegionResponse>>>

    /**
     * 获取收货地址
     */
    @POST(UrlConfig.PATH_GET_ADDRESS)
    fun getAddress(): Observable<BaseHttpResult<List<GetAddressResponse?>>>

    /**
     * 添加收货地址
     * @param consignee 联系人名称
     * @param region_list [省份code，市code，区code] 可在获取省市区接口获取
     * @param address 详细地址
     * @param mobile 联系人电话
     * @param is_default 是否默认电话
     */
    @POST(UrlConfig.PATH_ADD_ADDRESS)
    fun addAddress(@Body getAddressResponse: GetAddressResponse): Observable<BaseHttpResult<GetAddressResponse>>

    /**
     * 编辑收货地址
     * @param userAddressId 地址ID
     * @param consignee 联系人名称
     * @param region_list [省份code，市code，区code] 可在获取省市区接口获取
     * @param address 详细地址
     * @param mobile 联系人电话
     * @param is_default 是否默认电话
     */
    @POST(UrlConfig.PATH_EDIT_ADDRESS)
    fun editAddress(@Body getAddressResponse: GetAddressResponse): Observable<BaseHttpResult<GetAddressResponse>>

    /**
     * 删除地址
     * @param userAddressIds 删除地址ID
     */
    @POST(UrlConfig.PATH_DEL_ADDRESS)
    fun delAddress(@Body userAddressIds: UserAddressId): Observable<BaseHttpResult<EmptyResponse>>

    /**
     * 检测APP版本升级
     */
    @POST(UrlConfig.PATH_GET_VERSION)
    fun getAppNewlyVersion(): Observable<BaseHttpResult<GetAppNewlyVersionResponse?>>

    /**
     * 获取每日健康指数
     */
    @POST(UrlConfig.PATH_GET_DAILY)
    fun getDaily(@Body stay: Date): Observable<BaseHttpResult<ArrayList<DailyResponse>>>

    /**
     * 刷新token
     */
    @POST(UrlConfig.PATH_REFRESH_TOKEN)
    fun refreshToken(): Observable<BaseHttpResult<RefreshTokenResponse>>

    /**
     * 图片列表
     */
    @GET(UrlConfig.GET_ALBUM)
    fun getAlbum(@Query("max_id") maxId: Int?): Observable<BaseHttpResult<GetPhotoAlbumResponse>>

    /**
     * 添加图片
     */
    @POST(UrlConfig.POST_ADD_PHOTO)
    fun addPhoto(@Body addPhoto: AddPhoto): Observable<BaseHttpResult<EmptyResponse>>

    /**
     * 删除图片
     */
    @POST(UrlConfig.POST_DEL_PHOTO)
    fun delPhoto(@Body delPhoto: DelPhoto): Observable<BaseHttpResult<EmptyResponse>>

}